import store from "@/store";
import { saveAuth } from "./storage";
// 只要用到了token 优先从 本地存储里面获取

import axios from "axios";
import { getAuth, hasToken } from "./storage";

// 引入自己封装的history对象， 不被约束在 类组件或者函数组件中 ，可以任意地方进行调用
import history from "./history";

// 请求基地址
export const baseURL = "http://geek.itheima.net";

// 创建 axios 实例
const request = axios.create({
  baseURL: baseURL,
  timeout: 5000,
});

// 请求拦截器
request.interceptors.request.use(
  function (config) {
    // 获取token
    if (hasToken()) {
      // 把token 设置到请求头中
      config.headers.Authorization = "Bearer " + getAuth().token;
    }

    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  function (response) {
    // 响应状态码 是2xx 的时候就触发
    return response.data;
  },
  async function (error) {
    // 当相应状态码 4xx-5xx 的时候就会触发
    // console.log(error);
    if (error.response.status === 401) {
      //  如果这个代码触发 一定是 token过期
      // 去携带refreshToken去刷新token
      let { token, refresh_token } = getAuth();

      // 发送请求 不能使用 封装好的 request代码去发
      // const res = await axios.put(baseURL + "/v1_0/authorizations", {
      //   headers: { Authorization: `Bearer ${refresh_token}` },
      // });
      try {
        const res = await axios({
          url: baseURL + "/v1_0/authorizations",
          method: "put",
          headers: {
            Authorization: `Bearer ${refresh_token}`,
          },
        });

        // 设置为新的token
        token = res.data.data.token;
        // 把新token重新存储起来
        // 本地存储
        saveAuth({ token, refresh_token });
        // redux
        store.dispatch({
          type: "user/saveAuth",
          payload: { token, refresh_token },
        });

        // 重新去完成 之前失败的请求
        return request(error.config);
      } catch (error) {}
      history.push(`/login?from=${history.location.pathname}`);
    }
    return Promise.reject(error);
  }
);

// 导出 axios 实例
export default request;
